package main

import (
	"fmt"
	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
	"gitverse.ru/EdieLay/BirthdayReminderer/handlers"
	"gitverse.ru/EdieLay/BirthdayReminderer/utils"
	"log"
	"os"
	"sync"
	"time"
)

const dataFile = "users.json"
const envFile = ".env"

var bdChatID int64
var users = make(map[int64]utils.User)

func init() {
	var err error
	users, bdChatID, err = utils.Init(envFile, dataFile)
	if err != nil {
		if bdChatID == 0 {
			log.Print("Не удалось загрузить chat_id из .env")
			return
		}
		log.Fatal(err)
	}
}

func main() {
	bot, err := tgbotapi.NewBotAPI(os.Getenv("TELEGRAM_APITOKEN"))
	if err != nil {
		log.Fatal(err)
	}
	botMutex := sync.Mutex{}
	log.Print("Got API token")

	//bot.Debug = true

	updateConfig := tgbotapi.NewUpdate(0)
	updateConfig.Timeout = 60

	go pollCongratulations(bot, &botMutex)

	updates := bot.GetUpdatesChan(updateConfig)

	for update := range updates {
		if update.Message == nil {
			continue
		}

		if update.Message.Chat.Type == "private" {
			botMutex.Lock()
			if bdChatID != 0 {
				switch update.Message.Text {
				case "/start":
					handlers.Start(bot, update.Message.Chat.ID)
				case "/leave":
					handlers.Leave(bot, update.Message.Chat.ID, users, bdChatID, dataFile)
				default:
					handlers.AddUser(bot, update.Message.Chat.ID, users, bdChatID, update.Message.Text, dataFile)
				}
			} else {
				handlers.NoBirthdayChat(bot, update.Message.Chat.ID)
			}
			botMutex.Unlock()
		}
		if (update.Message.Chat.Type == "group" || update.Message.Chat.Type == "supergroup") && update.Message.Text == "/start" {
			botMutex.Lock()
			text := fmt.Sprintf("ID этого чата: %d", update.Message.Chat.ID)
			msg := tgbotapi.NewMessage(update.Message.Chat.ID, text)
			_, err := bot.Send(msg)
			if err != nil {
				log.Print(err)
			}
			botMutex.Unlock()
		}
	}
}

// pollCongratulations отправляет уведомления о днях рождения участников чата.
func pollCongratulations(bot *tgbotapi.BotAPI, mutex *sync.Mutex) {
	for {
		now := time.Now()
		// Уведолмение первый раз придёт при запуске кода, а затем каждый день в 9 утра.
		next := time.Date(now.Year(), now.Month(), now.Day()+1, 9, 0, 0, 0, now.Location())
		duration := next.Sub(now)

		mutex.Lock()
		for id, user := range users {
			chatMember, err := bot.GetChatMember(tgbotapi.GetChatMemberConfig{
				ChatConfigWithUser: tgbotapi.ChatConfigWithUser{
					ChatID: bdChatID,
					UserID: id,
				},
			})
			if err != nil {
				log.Print(err)
				continue
			}
			if chatMember.Status == "left" || chatMember.Status == "kicked" {
				delete(users, id)
				err := utils.SaveUsers(users, dataFile)
				if err != nil {
					log.Print(err)
				} else {
					log.Print("User ", id, " was deleted from the list")
				}
				continue
			}
			if user.Birthday.Month() == now.Month() && user.Birthday.Day() == now.Day() {
				text := fmt.Sprintf("[%s %s](tg://user?id=%d) сегодня отмечает День Рождения! Поздравляем!", user.FirstName, user.LastName, id)
				msg := tgbotapi.NewMessage(bdChatID, text)
				msg.ParseMode = "markdown"
				_, err := bot.Send(msg)
				if err != nil {
					log.Print(err)
				}
			}
		}
		mutex.Unlock()

		time.Sleep(duration)
	}
}
